var MapUtil = {}; // 地图工具


/******************************************************************************
 *
 * 创建地图
 *
 * ***************************************************************************/
MapUtil.createMap = function (id, option, param) {
    var _option = {
        enableMapClick: false,
        minZoom: 5,
        maxZoom: 19,
        mapType: BMAP_NORMAL_MAP
    };

    option = $.extend({}, _option, option);

    var map = new BMap.Map(id, option);

    var areaName = param.areaName;
    areaName = areaName.replace("省", "");
    if (null != areaName) {
        var aInfo = cityCenters[areaName];
        var lng = aInfo.lng;
        var lat = aInfo.lat;
        var zoomLevel = aInfo.zoom;
        map.centerAndZoom(new BMap.Point(lng, lat), zoomLevel);
    }
    map.disableDoubleClickZoom();
    map.enableScrollWheelZoom();

    MapUtil.addMapControl(map);
    MapUtil.setMapEvent(map);

    if ("dark" == userTheme) {
        // 设置地图样式
        var mapStyle = {};
        mapStyle["style"] = "midnight";
        map.setMapStyle(mapStyle);
    } else {
        map.setMapStyle(BCFG.styleSimple.styleJson);
    }

    return map;
}

/******************************************************************************
 *
 * 地图事件设置
 *
 * ***************************************************************************/
MapUtil.setMapEvent = function (map) {
    map.enableDragging();//启用地图拖拽事件，默认启用(可不写)
    map.enableScrollWheelZoom();//启用地图滚轮放大缩小
    map.enableDoubleClickZoom();//启用鼠标双击放大，默认启用(可不写)
    map.enableKeyboard();//启用键盘上下左右键移动地图
}

/******************************************************************************
 *
 * 地图控件设置
 *
 * ***************************************************************************/
MapUtil.addMapControl = function (map) {
    //向地图中添加缩放控件
    var ctrl_nav = new BMap.NavigationControl({anchor: BMAP_ANCHOR_BOTTOM_RIGHT, type: BMAP_NAVIGATION_CONTROL_SMALL});
    map.addControl(ctrl_nav);
    //向地图中添加比例尺控件
    var ctrl_sca = new BMap.ScaleControl({anchor: BMAP_ANCHOR_BOTTOM_LEFT});
    map.addControl(ctrl_sca);
}

/******************************************************************************
 *
 * 获取行政区域范围并添加覆盖物（覆盖此区域）
 *
 * ***************************************************************************/
MapUtil.showBoundary = function (map, areaName) {
    var bdary = new BMap.Boundary();
    bdary.get(areaName, function (rs) {       //获取行政区域
        var count = rs.boundaries.length; //行政区域的点有多少个
        if (count === 0) {
            tiperror('未能获取当前输入行政区域');
            return;
        }
        var ply = new BMap.Polygon(rs.boundaries[0], {
            strokeWeight: 1,
            strokeColor: "#337ab7",
            fillOpacity: "0.3",
            fillColor: "#000000"
        });
        map.addOverlay(ply);
        map.setViewport(ply.getPath());

        return;
        // 官方写法，但是因为百度地图数据问题，可能会返回多个行政区域，导致区域覆盖
        var pointArray = [];
        for (var i = 0; i < count; i++) {
            var ply = new BMap.Polygon(rs.boundaries[i], {
                strokeWeight: 1,
                strokeColor: "#337ab7",
                fillOpacity: "0.4",
                fillColor: "#000000"
            });
            map.addOverlay(ply);
            pointArray = pointArray.concat(ply.getPath());
        }
        map.setViewport(pointArray);
    });
}

/******************************************************************************
 *
 * 获取行政区域范围并添加覆盖物（覆盖其他区域）
 *
 * ***************************************************************************/
MapUtil.showBoundaryOther = function (map, areaName) {
    var bdary = new BMap.Boundary();
    bdary.get(areaName, function (rs) {       //获取行政区域
        var count = rs.boundaries.length; //行政区域的点有多少个
        if (count === 0) {
            alert('未能获取当前输入行政区域');
            return;
        }
        var points = rs.boundaries[0];

        // 定义覆盖大矩形
        var pNW = {lat: 90.0, lng: 0.0}
        var pNE = {lat: 90.0, lng: 180.0}
        var pSE = {lat: 0, lng: 180.0}
        var pSW = {lat: 0, lng: 0.0}
        var pArray = [];
        pArray.push(pSE);
        pArray.push(pSW);
        pArray.push(pNW);
        pArray.push(pNE);
        pArray.push(pSE);

        var polygon = new BMap.Polygon(points); //行政区覆盖物

        // 将闭合区域加到遮蔽层上
        pArray = pArray.concat(polygon.getPath());
        // 加入起点，形成闭合区域
        pArray.push(pArray[0]);

        // 添加遮蔽层
        var plyall = new BMap.Polygon(pArray, {
            strokeOpacity: 0.0000001,
            strokeColor: "#000000",
            strokeWeight: 0.0000001,
            fillColor: "#000000",
            fillOpacity: 0.8
        }); //建立多边形覆盖物
        map.addOverlay(plyall);
    });
}

/******************************************************************************
 *
 * 创建热力图
 *
 * ***************************************************************************/
MapUtil.createHeatMap = function (map, points, option) {
    var _option = {
        "radius": 20,
        "visible": true
    };

    option = $.extend({}, _option, option);

    var heatmapOverlay = new BMapLib.HeatmapOverlay(option);
    map.addOverlay(heatmapOverlay);
    heatmapOverlay.show();

    MapUtil.reflashHeatMap(heatmapOverlay, points);

    return heatmapOverlay;
}

/******************************************************************************
 *
 * 刷新热力图数据
 *
 * ***************************************************************************/
MapUtil.reflashHeatMap = function (heatmapOverlay, points) {
    points = points || [];

    // 求取最大值
    var maxarr = [];
    for (var i in points) {
        var count = parseInt(points[i].count || 0);
        maxarr.push(count);
        points[i]["count"] = count;
    }
    var max = Math.max.apply(null, maxarr);

    max = parseInt(max * 0.9);

    heatmapOverlay.setDataSet({"data": points, "max": max});
}

/******************************************************************************
 *
 * 创建鼠标绘制工具栏
 *
 * ***************************************************************************/
var curAreaOverlay;
MapUtil.drawingManager = function (map, callback) {
    var styleOptions = {
        strokeColor: "#2674A8",    //边线颜色。
        fillColor: "#2674A8",      //填充颜色。当参数为空时，圆形将没有填充效果。
        strokeWeight: 2,       //边线的宽度，以像素为单位。
        strokeOpacity: 0.8,    //边线透明度，取值范围0 - 1。
        fillOpacity: 0.3,      //填充的透明度，取值范围0 - 1。
        strokeStyle: 'solid' //边线的样式，solid或dashed。
    }
    //实例化鼠标绘制工具
    var drawingManager = new BMapLib.DrawingManager(map, {
        isOpen: false, //是否开启绘制模式
        enableDrawingTool: true, //是否显示工具栏
        drawingToolOptions: {
            anchor: BMAP_ANCHOR_TOP_RIGHT, //位置
            offset: new BMap.Size($(document).width() / 2 - 100, 5), //偏离值
            scale: 0.6,
            drawingModes: [BMAP_DRAWING_POLYGON, BMAP_DRAWING_RECTANGLE]
        },
        circleOptions: styleOptions, //圆的样式
        polylineOptions: styleOptions, //线的样式
        polygonOptions: styleOptions, //多边形的样式
        rectangleOptions: styleOptions //矩形的样式
    });

    //添加鼠标绘制工具监听事件，用于获取绘制结果
    drawingManager.addEventListener('overlaycomplete', function (e) {
        // 关闭画图模式
        drawingManager.close();

        // 清除之前绘制的图形
        if (null != curAreaOverlay) {
            map.removeOverlay(curAreaOverlay);
            map.closeInfoWindow();
        }

        curAreaOverlay = e.overlay;

        if (null != curAreaOverlay) {
            curAreaOverlay.enableEditing();
        }

        callback(MapUtil.drawingManagerInfo(curAreaOverlay));

        curAreaOverlay.addEventListener("lineupdate", function (e) {
            callback(MapUtil.drawingManagerInfo(curAreaOverlay));
        });
    });

    return drawingManager;
}

/******************************************************************************
 *
 * 地图鼠标绘制区域信息
 *
 * ***************************************************************************/
MapUtil.drawingManagerInfo = function (curAreaOverlay) {
    // 获得经纬度序列
    var sarr = [];
    var c = curAreaOverlay.getBounds().getCenter();
    var paths = curAreaOverlay.getPath();

    for (var i = 0; i < paths.length; i++) {
        var lngLat = paths[i];
        if (lngLat == null || lngLat == null) {
            continue;
        }
        sarr.push(lngLat.lng + "," + lngLat.lat);
    }

    var curAreaOverlayInfo = {};
    curAreaOverlayInfo["areaType"] = "polygon";
    curAreaOverlayInfo["lngLatList"] = sarr.join(";");
    curAreaOverlayInfo["centerLng"] = c.lng;
    curAreaOverlayInfo["centerLat"] = c.lat;
    curAreaOverlayInfo["zoom"] = map.getZoom();
    curAreaOverlayInfo["areaValue"] = parseInt(BMapLib.GeoUtils.getPolygonArea(curAreaOverlay));

    // 获取归属地
    var geoc = new BMap.Geocoder();
    geoc.getLocation(c, function (rs) {
        var addComp = rs.addressComponents;
        var province = addComp.province;
        var city = addComp.city;
        var district = addComp.district;

        $("#city").val(city);
        $("#district").val(district);
        $("#address").val(province + city + district);
    });

    curAreaOverlayInfo['curAreaOverlayInfo'] = curAreaOverlay;

    return curAreaOverlayInfo;
}

/******************************************************************************
 *
 * 地图清空
 *
 * ***************************************************************************/
MapUtil.clearAll = function (map) {
    map.clearOverlays();
}

/******************************************************************************
 *
 * GPS转成百度坐标
 *
 * ***************************************************************************/
MapUtil.gpsToBaidu = function (gpss, callback) {
    if (gpss.length < 1) {
        return;
    }
    gpss = gpss.replace(/ /g, "");
    var url = "http://api.map.baidu.com/geoconv/v1/?coords=$1&from=1&to=5&ak=sGZOkeDdDDh55kIiuYC2qUg1";
    url = url.replace("$1", gpss);

    $.ajax({
        url: url,
        async: false,
        dataType: "jsonp",
        success: function (req) {
            try {
                var gpsArr = req.result;

                var bmapArr = [];
                for (var i = 0; i < gpsArr.length; i++) {
                    var d = gpsArr[i];
                    var x = d.x;
                    var y = d.y;

                    bmapArr.push(x + "," + y);
                }

                callback(bmapArr);
            } catch (e) {
                tiperror("调用接口失败，请重新调用, 错误信息：" + e);
            }
        },
        error: function (e) {
            tiperror("调用接口失败，请重新调用，请检查参数是否正确");
        }
    });
}

/******************************************************************************
 *
 * 创建地图point
 *
 * ***************************************************************************/
MapUtil.createPoints = function (pointsArr, markerOption) {
    if (pointsArr.length < 1) {
        return;
    }

    var pArr = [];

    if (pointsArr.length < 100) {
        for (var i = 0; i < pointsArr.length; i++) {
            var p = pointsArr[i];
            var lng = p.lng;
            var lat = p.lat;

            // 基站中心点
            var point = new BMap.Point(lng, lat);
            pArr.push(point);
            if (!markerOption) {
                markerOption = {
                    icon: new BMap.Symbol(BMap_Symbol_SHAPE_POINT, {
                        scale: 1,
                        fillColor: 'red',
                        fillOpacity: 0.8,
                        strokeColor: 'red',
                        strokeOpacity: 0.8
                    })
                }
            }
            var marker = new BMap.Marker(point, markerOption);
            map.addOverlay(marker);
            marker.addEventListener('click', function (e) {
                tipsuccess('单击点的坐标为：' + e.point.lng + ', ' + e.point.lat);  // 监听点击事件
            });
        }
    } else {
        for (var i = 0; i < pointsArr.length; i++) {
            var p = pointsArr[i];
            var lng = p.lng;
            var lat = p.lat;

            // 基站中心点
            var point = new BMap.Point(lng, lat);
            pArr.push(point);
        }

        var options = {
            size: BMAP_POINT_SIZE_BIG,
            shape: BMAP_POINT_SHAPE_STAR,
            color: 'red'
        }
        var pointCollection = new BMap.PointCollection(pArr, options);  // 初始化PointCollection
        pointCollection.addEventListener('click', function (e) {
            tipsuccess('单击点的坐标为：' + e.point.lng + ', ' + e.point.lat);  // 监听点击事件
        });
        map.addOverlay(pointCollection);  // 添加Overlay
    }

    //让所有点在视野范围内
    map.setViewport(pArr);
    map.zoomOut();
}
